স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি লিখতে সহায়ক একটি টুল সরবরাহ করে। এর মাধ্যমে আপনি JPQL (Java Persistence Query Language) বা Native SQL কোয়েরি ব্যবহার করতে পারেন। Native SQL কোয়েরি ব্যবহার করলে, আপনি সরাসরি ডেটাবেসের জন্য SQL কোয়েরি লিখতে পারেন, যা JPA বা JPQL এর সীমাবদ্ধতার বাইরে কাজ করে।
Native Query কি?
Native Query হল একটি SQL কোয়েরি যা সরাসরি ডেটাবেসের জন্য লেখা হয়, যা JPQL এর মতো অবজেক্ট রিলেশনাল ম্যাপিংয়ের (ORM) শর্তাবলী অনুসরণ করে না। Native Query-তে আপনি সরাসরি ডেটাবেসের টেবিল নাম, কলাম নাম ব্যবহার করতে পারেন এবং এটি JPA এর মাধ্যমে এক্সিকিউট করা যায়।
@Query অ্যানোটেশন ব্যবহার করে Native SQL কোয়েরি চালানোর জন্য আপনাকে nativeQuery = true প্যারামিটার ব্যবহার করতে হবে।
@Query অ্যানোটেশন ব্যবহার করে Native Query লেখার উদাহরণ
Step ১: Entity ক্লাস তৈরি
ধরা যাক, আমাদের একটি Employee ক্লাস রয়েছে, যা একটি ডেটাবেস টেবিল employee এর প্রতিনিধিত্ব করে।
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
private double salary;
// Getters and Setters
}
এখানে, Employee ক্লাসটি employee টেবিলের ডেটা পরিচালনা করছে।
Step ২: Native Query জন্য Repository তৈরি
স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে Native SQL কোয়েরি চালানোর জন্য, nativeQuery = true ব্যবহার করতে হবে। নিচে কিছু উদাহরণ দেখানো হয়েছে:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Native SQL Query to fetch employees by department
@Query(value = "SELECT * FROM employee WHERE department = ?1", nativeQuery = true)
List<Employee> findEmployeesByDepartment(String department);
// Native SQL Query to fetch employees with salary greater than a certain value
@Query(value = "SELECT * FROM employee WHERE salary > :salary", nativeQuery = true)
List<Employee> findEmployeesWithSalaryGreaterThan(double salary);
// Native SQL Query with multiple parameters
@Query(value = "SELECT * FROM employee WHERE department = :department AND salary > :salary", nativeQuery = true)
List<Employee> findEmployeesByDepartmentAndSalary(String department, double salary);
}
Explanation:
findEmployeesByDepartment:- Native SQL কোয়েরি ব্যবহার করে
departmentএর উপর ভিত্তি করে কর্মচারীদের তথ্য ফেচ করছে। এখানে?1প্যারামিটারটি প্রথম আর্গুমেন্টdepartmentরেফারেন্স করছে।
- Native SQL কোয়েরি ব্যবহার করে
findEmployeesWithSalaryGreaterThan:- Native SQL কোয়েরি ব্যবহার করে কর্মচারীদের যা একটি নির্দিষ্ট salary এর বেশি, তা ফেচ করছে। এখানে
:salaryপ্যারামিটারটি ব্যবহার করা হয়েছে।
- Native SQL কোয়েরি ব্যবহার করে কর্মচারীদের যা একটি নির্দিষ্ট salary এর বেশি, তা ফেচ করছে। এখানে
findEmployeesByDepartmentAndSalary:- Native SQL কোয়েরি ব্যবহার করে
departmentএবংsalaryউভয়ের উপর ভিত্তি করে কর্মচারীদের তথ্য ফেচ করছে।
- Native SQL কোয়েরি ব্যবহার করে
Step ৩: Service ক্লাস তৈরি
স্প্রিং সার্ভিস ক্লাসে Repository ইনজেক্ট করে Native Query মেথডগুলো কল করা হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public List<Employee> getEmployeesByDepartment(String department) {
return employeeRepository.findEmployeesByDepartment(department);
}
public List<Employee> getEmployeesWithSalaryGreaterThan(double salary) {
return employeeRepository.findEmployeesWithSalaryGreaterThan(salary);
}
public List<Employee> getEmployeesByDepartmentAndSalary(String department, double salary) {
return employeeRepository.findEmployeesByDepartmentAndSalary(department, salary);
}
}
Step ৪: Controller ক্লাস তৈরি
স্প্রিং Controller ক্লাসে সার্ভিস মেথডগুলো কল করে এবং ডেটা ক্লায়েন্টের কাছে পাঠানো হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/employees/department/{department}")
public List<Employee> getEmployeesByDepartment(@PathVariable String department) {
return employeeService.getEmployeesByDepartment(department);
}
@GetMapping("/employees/salary/{salary}")
public List<Employee> getEmployeesWithSalaryGreaterThan(@PathVariable double salary) {
return employeeService.getEmployeesWithSalaryGreaterThan(salary);
}
@GetMapping("/employees/department/{department}/salary/{salary}")
public List<Employee> getEmployeesByDepartmentAndSalary(@PathVariable String department, @PathVariable double salary) {
return employeeService.getEmployeesByDepartmentAndSalary(department, salary);
}
}
এখানে, EmployeeController ক্লাসে Native Query মেথডগুলো কল করা হয়েছে এবং ডেটা GET API মাধ্যমে রিটার্ন করা হচ্ছে।
@Query অ্যানোটেশন এবং Native Query ব্যবহারের সুবিধা
- কাস্টম কোয়েরি লেখা সহজ: Native SQL কোয়েরি ব্যবহার করে আপনি যেকোনো জটিল SQL কোয়েরি সরাসরি লিখতে পারবেন এবং JPA এর সীমাবদ্ধতা এড়াতে পারবেন।
- ডেটাবেস স্পেসিফিক অপটিমাইজেশন: Native SQL কোয়েরি ব্যবহার করলে ডেটাবেসের নির্দিষ্ট সুবিধাগুলি ব্যবহার করা যায়, যেমন ইনডেক্সিং, ডেটাবেস স্পেসিফিক ফাংশন ইত্যাদি।
- ফ্লেক্সিবিলিটি:
@Queryঅ্যানোটেশন আপনার জন্য কোয়েরি লিখতে খুব সহজ করে তোলে এবং আপনি JPQL অথবা SQL উভয়ই ব্যবহার করতে পারেন।
উপসংহার
স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে Native Query লেখা খুবই সহজ এবং কার্যকরী। এটি স্প্রিং ডেটা জেপিএ ব্যবহারকারীদের JPA বা JPQL কোয়েরি সীমাবদ্ধতার বাইরে যেতে এবং ডেটাবেসের জন্য SQL কোয়েরি লিখতে সক্ষম করে। স্প্রিং ডেটা জেপিএ দিয়ে কাস্টম Native SQL কোয়েরি ব্যবহার করে ডেটাবেস অপারেশনগুলি আরও দ্রুত এবং কার্যকরী করা যায়।